package com.dzl.render;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.*;
/**
 * 
 * @Description:导出word
 * @author liufan
 * @time:2021年4月24日 下午3:57:55
 */
public class DocumentHandler {

	private Configuration configuration = null;

	public DocumentHandler() {
		configuration = new Configuration(Configuration.VERSION_2_3_23);
		configuration.setDefaultEncoding("utf-8");
	}

	/**
	 * 导出word文件公共方法
	 * @param os
	 * @param dataMap 数据
	 * @param templateFileName 模版文件名，带后缀名，如：******.ftl
	 * @throws UnsupportedEncodingException
	 */
	public void createDoc(OutputStream os,Object dataMap,String templateFileName) throws UnsupportedEncodingException {
		//dataMap 要填入模本的数据文件
		//设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet，classpath，数据库装载，
		//这里我们的模板是放在template包下面
		configuration.setClassForTemplateLoading(this.getClass(), "/template");
		Template t=null;
		try {
			//test.ftl为要装载的模板
			t = configuration.getTemplate(templateFileName);
		} catch (IOException e) {
			e.printStackTrace();
		}
		//这个地方对流的编码不可或缺，使用main（）单独调用时，应该可以，但是如果是web请求导出时导出后word文档就会打不开，并且包XML文件错误。主要是编码格式不正确，无法解析。
		//out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
		Writer out = new BufferedWriter(new OutputStreamWriter(os,"UTF-8")); 
        try {
			t.process(dataMap, out);
			out.close();
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
